#!/bin/bash
stty sane
stty erase ^H
# start1
MYSQL_USER="root"
MYSQL_PASSWORD="Abcdefg@123"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="43306"
OA_DB_NAME="gouguoa"
BLOG_DB_NAME="gougublog"
DEV_DB_NAME="gougudev"

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho
rm -rf /www/wwwroot/office/public/storage/storage_backup /www/wwwroot/blog/public/storage/storage_backup /www/wwwroot/dev/public/storage/storage_backup

rm -rf $bak_pathu/{office.tar.gz,blog.tar.gz,dev.tar.gz,gouguoa.sql.gz,gougublog.sql.gz,gougudev.sql.gz} $bak_pathg/{office.tar.gz,blog.tar.gz,dev.tar.gz,gouguoa.sql.gz,gougublog.sql.gz,gougudev.sql.gz}
# 检测MySQL连接
if ! mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P $MYSQL_PORT -e "SELECT 1" > /dev/null 2>&1; then
    echo "错误：无法连接到MySQL服务器，请检查服务状态或配置！" >&2
    exit 1
fi
cd /data
#这里的mysqldump路径修改成实际的路径、-u用户名 -p密码，都要修改
mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P $MYSQL_PORT $OA_DB_NAME | gzip > $bak_pathg/gouguoa.sql.gz
mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P $MYSQL_PORT $BLOG_DB_NAME | gzip > $bak_pathg/gougublog.sql.gz
mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P $MYSQL_PORT $DEV_DB_NAME | gzip > $bak_pathg/gougudev.sql.gz
#
echo "#####################################"
echo "mysql备份完成"
#
# end1

# start2
echo "#####################################"

# MySQL数据库连接配置
MYSQL_USER="root"
MYSQL_PASSWORD="Abcdefg@123"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="43306"
OA_DB_NAME="gouguoa"
BLOG_DB_NAME="gougublog"
DEV_DB_NAME="gougudev"

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho

# SQL执行状态记录文件
SQL_STATUS_FILE="/opt/updatemysqllog/oa_upgrade_status.log"
mkdir -p /opt/updatemysqllog
touch $SQL_STATUS_FILE

# 处理记录
cp -f /opt/updatemysqllog/oa_upgrade_status.log /opt/updatemysqllog/oa_upgrade_status.log.bak

# 获取当前OA版本
get_current_version() {
    local index_file="/www/wwwroot/office/public/index.php"
    if [ -f "$index_file" ]; then
        local version=$(grep "define('CMS_VERSION'" "$index_file" | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?")
        echo "$version"
    else
        echo "0.0.0"
    fi
}

# 从SQL文件名提取版本号
extract_version_from_filename() {
    local filename="$1"
    local version=$(echo "$filename" | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?")
    echo "$version"
}

# 版本比较函数
version_compare() {
    local ver1=$(echo "$1" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    local ver2=$(echo "$2" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    
    local v1=($(echo "$ver1" | tr '.' ' '))
    local v2=($(echo "$ver2" | tr '.' ' '))
    
    for ((i=0; i<3; i++)); do
        if [ -z "${v1[i]}" ]; then v1[i]=0; fi
        if [ -z "${v2[i]}" ]; then v2[i]=0; fi
        
        if [ "${v1[i]}" -gt "${v2[i]}" ]; then
            echo "greater"
            return
        elif [ "${v1[i]}" -lt "${v2[i]}" ]; then
            echo "less"
            return
        fi
    done
    
    echo "equal"
}

# 计算MD5校验和
calculate_md5() {
    md5sum "$1" | awk '{print $1}'
}

# 带状态记录的SQL执行函数
execute_sql_with_status() {
    local sql_file="$1"
    local file_name=$(basename "$sql_file")
    local md5_checksum=$(calculate_md5 "$sql_file")
    
    # 检查是否已成功执行过相同文件
    if grep -q "^${file_name}|SUCCESS|.*|${md5_checksum}" "$SQL_STATUS_FILE"; then
        echo "检测到 ${file_name} 已成功执行且未修改，跳过执行"
        return 0
    fi
    
    # 记录开始执行
    echo "${file_name}|STARTED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$SQL_STATUS_FILE"
    
    # 执行SQL并捕获错误输出
    echo "========== 开始执行SQL文件: $file_name =========="
    error_msg=$(mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$OA_DB_NAME" < "$sql_file" 2>&1 >/dev/null)
    if [ $? -eq 0 ]; then
        # 执行成功
        echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$SQL_STATUS_FILE"
        echo "========== SQL执行成功 =========="
        return 0
    else
        # 执行失败
        echo "${file_name}|FAILED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|${error_msg}" >> "$SQL_STATUS_FILE"
        echo "========== SQL执行失败 =========="
        echo "错误信息: $error_msg"
        
        # 执行回滚操作
        echo "检测到SQL执行失败，开始回滚..."
        restore_backup
        return 1
    fi
}

# 自动标记已升级版本为SUCCESS
mark_previous_versions_as_success() {
    local current_version="$1"
    local updatesql="$2"
    
    # 标准化当前版本为三位格式
    local std_current_version=$(echo "$current_version" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    
    echo "检测到当前版本为 $current_version (标准化: $std_current_version)，自动标记较低版本的升级脚本为成功状态..."
    
    for sql_file in $updatesql/*.sql; do
        if [ -f "$sql_file" ]; then
            local file_name=$(basename "$sql_file")
            local file_version=$(extract_version_from_filename "$file_name")
            # 标准化文件版本为三位格式
            local std_file_version=$(echo "$file_version" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            
            local comparison=$(version_compare "$std_file_version" "$std_current_version")
            
            if [ "$comparison" = "less" ] || [ "$comparison" = "equal" ]; then
                local md5_checksum=$(calculate_md5 "$sql_file")
                # 检查是否已经记录过
                if ! grep -q "^${file_name}|" "$SQL_STATUS_FILE"; then
                    echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|auto-marked" >> "$SQL_STATUS_FILE"
                    echo "自动标记: $file_name (版本 $file_version) 为已成功状态"
                fi
            fi
        fi
    done
}

# 回滚函数
restore_backup() {
    echo "正在从备份恢复..."

    # 先删除现有数据库
    echo "删除现有数据库..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $OA_DB_NAME;"
    
    # 重新创建空数据库
    echo "重新创建空数据库..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "CREATE DATABASE $OA_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
    
    # 恢复数据库
    echo "恢复数据库..."
    zcat $bak_pathg/gouguoa.sql.gz | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$OA_DB_NAME"
    
    # 恢复文件系统
    echo "恢复文件系统..."
    rm -rf /www/wwwroot/office/*
    tar -xzf $bak_pathg/office.tar.gz -C /www/wwwroot
    
    echo "回滚完成，系统已恢复到升级前状态"
    echo " "
    echo "1、请处理上面提示问题后重新升级。"
    echo "2、之前已经正常升级过的（务必正常升级过的）请执行下面命令修复后，继续执行升级程序,其中gougu为容器名称，若为其他名称请自行修改， "
    echo "docker安装的执行：docker exec -it gougu sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/oa_upgrade_status.log"
    echo "纯系统安装的执行：sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/oa_upgrade_status.log"
    echo " "
    echo " "
    exit 1
}

echo "#####################################"
echo "开始升级OA系统..."

# 获取当前版本
CURRENT_VERSION=$(get_current_version)
echo "当前OA系统版本: $CURRENT_VERSION"

# 如果版本获取失败，设置默认版本
if [ -z "$CURRENT_VERSION" ] || [ "$CURRENT_VERSION" = "0.0.0" ]; then
    echo "警告：无法获取当前版本，假设为初始版本 5.1.7"
    CURRENT_VERSION="5.1.7"
fi

# 通过创建删除临时文件来更新office目录的修改时间
echo "####" > /www/wwwroot/office/read.txt
rm -rf /www/wwwroot/office/read.txt

# 备份并更新OA文件
echo "备份当前OA系统..."
rm -rf /data/office $bak_pathu/office.tar.gz $bak_pathg/office.tar.gz
tar -czf $bak_pathg/office.tar.gz -C /www/wwwroot office

echo "克隆最新的 OA 代码..."
cd /data
git clone https://gitee.com/gouguopen/office.git || { echo "克隆失败，正在回滚..."; restore_backup; }

# 备份并恢复storage目录
echo "备份并恢复文件..."
mkdir -p /data/storage_backup
# 备份用户上传的文件（/public/storage目录）
if [ -d "/www/wwwroot/office/public/storage" ]; then
    cp -rf /www/wwwroot/office/public/storage/* /data/storage_backup/ 2>/dev/null || true
    echo "已备份文件"
else
    echo "未找到目录，跳过备份"
fi

# 更新系统文件
echo "更新系统文件..."
cp -fru /data/office/* /www/wwwroot/office/

# 恢复用户上传的文件
echo "恢复文件..."
if [ -d "/data/storage_backup" ] && [ "$(ls -A /data/storage_backup 2>/dev/null)" ]; then
    cp -rf /data/storage_backup/* /www/wwwroot/office/public/storage/ 2>/dev/null || true
    echo "文件恢复完成"
else
    echo "无文件需要恢复"
fi



# 清理备份
rm -rf /data/storage_backup

# 清理缓存
echo "清理系统缓存..."
cd /www/wwwroot/office
php think clear

# 设置目录权限
echo "设置文件权限..."
chmod -R 777 /www/wwwroot/office/{app,public,config,runtime}

# 更新数据库配置文件
echo "更新数据库连接配置..."
oasql=gouguoa
oauser=gouguoa
oapass=Abcdefg@123
oaport=43306
sed -i "s/'database'\s*=>\s*'[^']*'/'database'           =>  '$oasql'/" /www/wwwroot/office/config/database.php
sed -i "s/'username'\s*=>\s*'[^']*'/'username'           =>  '$oauser'/" /www/wwwroot/office/config/database.php
sed -i "s/'password'\s*=>\s*'[^']*'/'password'           =>  '$oapass'/" /www/wwwroot/office/config/database.php
sed -i "s/'hostport'\s*=>\s*'[^']*'/'hostport'           =>  '$oaport'/" /www/wwwroot/office/config/database.php

echo "#####################################"
# 处理升级文件（例如 SQL 脚本）
updatesql=/data/updatesql
rm -rf $updatesql
mkdir -p $updatesql

# 下载所有SQL升级文件
echo "正在下载升级文件..."
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate001_5.1.8.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate002_5.5.0.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate003_5.6.0.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate004_5.7.6.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate005_5.8.0.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate006_5.9.0.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate007_5.9.2.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate008_5.9.3.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate009_5.9.5.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate010_5.9.6.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate011_5.9.8.sql
wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate012_5.9.9.sql

# 为所有SQL文件添加MySQL dump头
SQL_HEADER="-- MySQL dump 10.13  Distrib 8.0.36, for Linux (x86_64)
--
-- Host: 127.0.0.1    Database: gouguoa
-- ------------------------------------------------------
-- Server version    8.0.36

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

"

for sql_file in $updatesql/*.sql; do
    if [ -f "$sql_file" ]; then
        temp_file="${sql_file}.tmp"
        echo "$SQL_HEADER" > "$temp_file"
        cat "$sql_file" >> "$temp_file"
        mv "$temp_file" "$sql_file"
        echo "数据库文件: $(basename "$sql_file")"
    fi
done

# 自动标记已升级版本为SUCCESS
mark_previous_versions_as_success "$CURRENT_VERSION" "$updatesql"

# 使用find命令获取updatesql目录下所有的.sql文件并按名称排序
UPGRADE_FILES=$(find "$updatesql" -maxdepth 1 -name "*.sql" | sort)

echo "开始执行升级脚本..."
while IFS= read -r UPGRADE_FILE; do
    if [ -f "$UPGRADE_FILE" ]; then
        file_name=$(basename "$UPGRADE_FILE")
        file_version=$(extract_version_from_filename "$file_name")
        # 标准化版本进行比较
        std_file_version=$(echo "$file_version" | awk -F. '{ 
            for(i=1;i<=3;i++) { 
                if($i=="") $i=0 
            } 
            printf "%d.%d.%d", $1, $2, $3 
        }')
        std_current_version=$(echo "$CURRENT_VERSION" | awk -F. '{ 
            for(i=1;i<=3;i++) { 
                if($i=="") $i=0 
            } 
            printf "%d.%d.%d", $1, $2, $3 
        }')
        
        comparison=$(version_compare "$std_file_version" "$std_current_version")
        
        if [ "$comparison" = "greater" ]; then
            echo "需要执行升级: $file_name (版本 $file_version > 当前版本 $CURRENT_VERSION)"
            if ! execute_sql_with_status "$UPGRADE_FILE"; then
                exit 1
            fi
        else
            echo "跳过已升级: $file_name (版本 $file_version <= 当前版本 $CURRENT_VERSION)"
        fi
    else
        echo "警告：升级文件 $(basename "$UPGRADE_FILE") 不存在，跳过！"
    fi
done <<< "$UPGRADE_FILES"

# 删除下载的数据库文件
sleep 2
rm -rf $updatesql
echo "#####################################"

rm -rf /www/wwwroot/office/app/install
tar -czf $bak_pathu/office.tar.gz -C /www/wwwroot office
rm -rf /data/office
echo "oa升级完成"
# end2



#!/bin/bash
# start3
MYSQL_USER="root"
MYSQL_PASSWORD="Abcdefg@123"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="43306"
OA_DB_NAME="gouguoa"
BLOG_DB_NAME="gougublog"
DEV_DB_NAME="gougudev"

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho

# SQL执行状态记录文件
SQL_STATUS_FILE="/opt/updatemysqllog/blog_upgrade_status.log"
mkdir -p /opt/updatemysqllog
touch $SQL_STATUS_FILE

# 处理记录
cp -f /opt/updatemysqllog/blog_upgrade_status.log /opt/updatemysqllog/blog_upgrade_status.log.bak

# 获取当前BLOG版本
get_current_version() {
    local index_file="/www/wwwroot/blog/public/index.php"
    if [ -f "$index_file" ]; then
        local version=$(grep -E "define\('CMS_VERSION'|define\('BLOG_VERSION'" "$index_file" | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?")
        echo "$version"
    else
        echo "0.0.0"
    fi
}

# 从SQL文件名提取版本号
extract_version_from_filename() {
    local filename="$1"
    local version=$(echo "$filename" | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?")
    echo "$version"
}

# 版本比较函数
version_compare() {
    local ver1=$(echo "$1" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    local ver2=$(echo "$2" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    
    local v1=($(echo "$ver1" | tr '.' ' '))
    local v2=($(echo "$ver2" | tr '.' ' '))
    
    for ((i=0; i<3; i++)); do
        if [ -z "${v1[i]}" ]; then v1[i]=0; fi
        if [ -z "${v2[i]}" ]; then v2[i]=0; fi
        
        if [ "${v1[i]}" -gt "${v2[i]}" ]; then
            echo "greater"
            return
        elif [ "${v1[i]}" -lt "${v2[i]}" ]; then
            echo "less"
            return
        fi
    done
    
    echo "equal"
}

# 计算MD5校验和
calculate_md5() {
    md5sum "$1" | awk '{print $1}'
}

# 自动标记已升级版本为SUCCESS
mark_previous_versions_as_success() {
    local current_version="$1"
    local updatesql="$2"
    
    # 标准化当前版本为三位格式
    local std_current_version=$(echo "$current_version" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    
    echo "检测到当前BLOG版本为 $current_version (标准化: $std_current_version)，自动标记较低版本的升级脚本为成功状态..."
    
    for sql_file in $updatesql/*.sql; do
        if [ -f "$sql_file" ]; then
            local file_name=$(basename "$sql_file")
            local file_version=$(extract_version_from_filename "$file_name")
            # 标准化文件版本为三位格式
            local std_file_version=$(echo "$file_version" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            
            local comparison=$(version_compare "$std_file_version" "$std_current_version")
            
            if [ "$comparison" = "less" ] || [ "$comparison" = "equal" ]; then
                local md5_checksum=$(calculate_md5 "$sql_file")
                # 检查是否已经记录过
                if ! grep -q "^${file_name}|" "$SQL_STATUS_FILE"; then
                    echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|auto-marked" >> "$SQL_STATUS_FILE"
                    echo "自动标记: $file_name (版本 $file_version) 为已成功状态"
                fi
            fi
        fi
    done
}

# 带状态记录的SQL执行函数
execute_sql_with_status() {
    local sql_file="$1"
    local file_name=$(basename "$sql_file")
    local md5_checksum=$(calculate_md5 "$sql_file")
    
    # 检查是否已成功执行过相同文件
    if grep -q "^${file_name}|SUCCESS|.*|${md5_checksum}" "$SQL_STATUS_FILE"; then
        echo "检测到 ${file_name} 已成功执行且未修改，跳过执行"
        return 0
    fi
    
    # 记录开始执行
    echo "${file_name}|STARTED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$SQL_STATUS_FILE"
    
    # 执行SQL并捕获错误输出
    echo "========== 开始执行BLOG SQL文件: $file_name =========="
    error_msg=$(mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$BLOG_DB_NAME" < "$sql_file" 2>&1 >/dev/null)
    if [ $? -eq 0 ]; then
        # 执行成功
        echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$SQL_STATUS_FILE"
        echo "========== BLOG SQL执行成功 =========="
        return 0
    else
        # 执行失败
        echo "${file_name}|FAILED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|${error_msg}" >> "$SQL_STATUS_FILE"
        echo "========== BLOG SQL执行失败 =========="
        echo "错误信息: $error_msg"
        
        # 执行回滚操作
        echo "检测到BLOG SQL执行失败，开始回滚..."
        restore_backup
        return 1
    fi
}

# 回滚函数
restore_backup() {
    echo "正在从备份恢复BLOG系统..."

    # 先删除现有数据库
    echo "删除现有数据库..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $BLOG_DB_NAME;"
    
    # 重新创建空数据库
    echo "重新创建空数据库..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "CREATE DATABASE $BLOG_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
    
    # 恢复数据库
    echo "恢复BLOG数据库..."
    zcat $bak_pathg/gougublog.sql.gz | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$BLOG_DB_NAME"
    
    # 恢复文件系统
    echo "恢复BLOG文件系统..."
    rm -rf /www/wwwroot/blog/*
    tar -xzf $bak_pathg/blog.tar.gz -C /www/wwwroot
    
    echo "BLOG回滚完成，系统已恢复到升级前状态"
    echo " "
    echo "1、请处理上面提示问题后重新升级。"
    echo "2、之前已经正常升级过的（务必正常升级过的）请执行下面命令修复后，继续执行升级程序,其中gougu为容器名称，若为其他名称请自行修改， "
    echo "docker安装的执行：docker exec -it gougu sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/blog_upgrade_status.log"
    echo "纯系统安装的执行：sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/blog_upgrade_status.log"
    echo " "
    echo " "
    exit 1
}

echo "#####################################"
echo "开始升级BLOG系统..."

# 获取当前版本
CURRENT_VERSION=$(get_current_version)
echo "当前BLOG系统版本: $CURRENT_VERSION"

# 如果版本获取失败，设置默认版本
if [ -z "$CURRENT_VERSION" ] || [ "$CURRENT_VERSION" = "0.0.0" ]; then
    echo "警告：无法获取当前版本，假设为初始版本 3.6.27"
    CURRENT_VERSION="3.6.27"
fi

# 通过创建删除临时文件来更新blog目录的修改时间
echo "####" > /www/wwwroot/blog/read.txt
rm -rf /www/wwwroot/blog/read.txt

# 备份当前BLOG系统
echo "备份当前BLOG系统..."
rm -rf /data/blog $bak_pathu/blog.tar.gz $bak_pathg/blog.tar.gz
tar -czf $bak_pathg/blog.tar.gz -C /www/wwwroot blog

# 克隆新版本
echo "下载新版本BLOG..."
cd /data
git clone https://gitee.com/gouguopen/blog.git || { echo "克隆失败，正在回滚..."; restore_backup; }

# 备份并恢复用户上传文件
echo "备份并恢复文件..."
mkdir -p /data/storage_backup

# 备份用户上传的文件（storage/app/public目录）
if [ -d "/www/wwwroot/blog/public/storage" ]; then
    cp -rf /www/wwwroot/blog/public/storage/* /data/storage_backup/ 2>/dev/null || true
    echo "已备份文件"
else
    echo "未找到目录，跳过备份"
fi

# 更新系统文件
echo "更新系统文件..."
cp -fru /data/blog/* /www/wwwroot/blog/

# 恢复用户上传的文件
echo "恢复文件..."
if [ -d "/data/storage_backup" ] && [ "$(ls -A /data/storage_backup 2>/dev/null)" ]; then
    cp -rf /data/storage_backup/* /www/wwwroot/blog/public/storage/ 2>/dev/null || true
    echo "文件恢复完成"
else
    echo "无文件需要恢复"
fi

# 清理备份
rm -rf /data/storage_backup

# 清理缓存
echo "清理系统缓存..."
cd /www/wwwroot/blog
php think clear

# 设置目录权限
echo "设置文件权限..."
chmod -R 777 /www/wwwroot/blog/{app,public,config,runtime}

# 更新数据库配置文件
echo "更新数据库连接配置..."
blogsql=gougublog
bloguser=gougublog
blogpass=Abcdefg@123
blogport=43306
sed -i "s/'database'\s*=>\s*'[^']*'/'database'           =>  '$blogsql'/" /www/wwwroot/blog/config/database.php
sed -i "s/'username'\s*=>\s*'[^']*'/'username'           =>  '$bloguser'/" /www/wwwroot/blog/config/database.php
sed -i "s/'password'\s*=>\s*'[^']*'/'password'           =>  '$blogpass'/" /www/wwwroot/blog/config/database.php
sed -i "s/'hostport'\s*=>\s*'[^']*'/'hostport'           =>  '$blogport'/" /www/wwwroot/blog/config/database.php

echo "#####################################"
# 处理升级文件（例如 SQL 脚本）
updatesql=/data/updatesql
rm -rf $updatesql
mkdir -p $updatesql

# 下载所有SQL升级文件
echo "正在下载升级文件..."
#wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/blogsql/blogupdate000.5.18.sql
#wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/blogsql/blogupdate001_5.1.8.sql
#wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/blogsql/blogupdate002_5.5.0.sql

# 为所有SQL文件添加MySQL dump头
SQL_HEADER="-- MySQL dump 10.13  Distrib 8.0.36, for Linux (x86_64)
--
-- Host: 127.0.0.1    Database: gougublog
-- ------------------------------------------------------
-- Server version    8.0.36

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

"

for sql_file in $updatesql/*.sql; do
    if [ -f "$sql_file" ]; then
        temp_file="${sql_file}.tmp"
        echo "$SQL_HEADER" > "$temp_file"
        cat "$sql_file" >> "$temp_file"
        mv "$temp_file" "$sql_file"
        echo "数据库文件: $(basename "$sql_file")"
    fi
done

# 自动标记已升级版本为SUCCESS
mark_previous_versions_as_success "$CURRENT_VERSION" "$updatesql"

# 使用find命令获取updatesql目录下所有的.sql文件并按名称排序
UPGRADE_FILES=$(find "$updatesql" -maxdepth 1 -name "*.sql" | sort)

echo "开始执行BLOG升级脚本..."
while IFS= read -r UPGRADE_FILE; do
    if [ -f "$UPGRADE_FILE" ]; then
        file_name=$(basename "$UPGRADE_FILE")
        file_version=$(extract_version_from_filename "$file_name")
        # 标准化版本进行比较
        std_file_version=$(echo "$file_version" | awk -F. '{ 
            for(i=1;i<=3;i++) { 
                if($i=="") $i=0 
            } 
            printf "%d.%d.%d", $1, $2, $3 
        }')
        std_current_version=$(echo "$CURRENT_VERSION" | awk -F. '{ 
            for(i=1;i<=3;i++) { 
                if($i=="") $i=0 
            } 
            printf "%d.%d.%d", $1, $2, $3 
        }')
        
        comparison=$(version_compare "$std_file_version" "$std_current_version")
        
        if [ "$comparison" = "greater" ]; then
            echo "需要执行升级: $file_name (版本 $file_version > 当前版本 $CURRENT_VERSION)"
            if ! execute_sql_with_status "$UPGRADE_FILE"; then
                exit 1
            fi
        else
            echo "跳过已升级: $file_name (版本 $file_version <= 当前版本 $CURRENT_VERSION)"
        fi
    else
        echo "警告：升级文件 $(basename "$UPGRADE_FILE") 不存在，跳过！"
    fi
done <<< "$UPGRADE_FILES"

# 删除下载的数据库文件
sleep 2
rm -rf $updatesql
echo "#####################################"

# 清理安装目录并创建更新备份
rm -rf /www/wwwroot/blog/app/install
tar -czf $bak_pathu/blog.tar.gz -C /www/wwwroot blog
rm -rf /data/blog

# 清修文件
echo "清修文件..."
sed -i '136,157d' /www/wwwroot/blog/app/home/view/index/index.html
if [ $? -eq 0 ]; then
    echo "清修成功！"
else
    echo "清修失败，正在回滚..."
    restore_backup
fi

echo "BLOG升级完成"
# end3




#!/bin/bash
# start4
MYSQL_USER="root"
MYSQL_PASSWORD="Abcdefg@123"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="43306"
OA_DB_NAME="gouguoa"
BLOG_DB_NAME="gougublog"
DEV_DB_NAME="gougudev"

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho

# SQL执行状态记录文件
SQL_STATUS_FILE="/opt/updatemysqllog/dev_upgrade_status.log"
mkdir -p /opt/updatemysqllog
touch $SQL_STATUS_FILE

# 处理记录
cp -f /opt/updatemysqllog/dev_upgrade_status.log /opt/updatemysqllog/dev_upgrade_status.log.bak

# 获取当前DEV版本
get_current_version() {
    local index_file="/www/wwwroot/dev/public/index.php"
    if [ -f "$index_file" ]; then
        local version=$(grep -E "define\('CMS_VERSION'|define\('DEV_VERSION'" "$index_file" | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?")
        echo "$version"
    else
        echo "0.0.0"
    fi
}

# 从SQL文件名提取版本号
extract_version_from_filename() {
    local filename="$1"
    local version=$(echo "$filename" | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?")
    echo "$version"
}

# 版本比较函数
version_compare() {
    local ver1=$(echo "$1" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    local ver2=$(echo "$2" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    
    local v1=($(echo "$ver1" | tr '.' ' '))
    local v2=($(echo "$ver2" | tr '.' ' '))
    
    for ((i=0; i<3; i++)); do
        if [ -z "${v1[i]}" ]; then v1[i]=0; fi
        if [ -z "${v2[i]}" ]; then v2[i]=0; fi
        
        if [ "${v1[i]}" -gt "${v2[i]}" ]; then
            echo "greater"
            return
        elif [ "${v1[i]}" -lt "${v2[i]}" ]; then
            echo "less"
            return
        fi
    done
    
    echo "equal"
}

# 计算MD5校验和
calculate_md5() {
    md5sum "$1" | awk '{print $1}'
}

# 自动标记已升级版本为SUCCESS
mark_previous_versions_as_success() {
    local current_version="$1"
    local updatesql="$2"
    
    # 标准化当前版本为三位格式
    local std_current_version=$(echo "$current_version" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    
    echo "检测到当前DEV版本为 $current_version (标准化: $std_current_version)，自动标记较低版本的升级脚本为成功状态..."
    
    for sql_file in $updatesql/*.sql; do
        if [ -f "$sql_file" ]; then
            local file_name=$(basename "$sql_file")
            local file_version=$(extract_version_from_filename "$file_name")
            # 标准化文件版本为三位格式
            local std_file_version=$(echo "$file_version" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            
            local comparison=$(version_compare "$std_file_version" "$std_current_version")
            
            if [ "$comparison" = "less" ] || [ "$comparison" = "equal" ]; then
                local md5_checksum=$(calculate_md5 "$sql_file")
                # 检查是否已经记录过
                if ! grep -q "^${file_name}|" "$SQL_STATUS_FILE"; then
                    echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|auto-marked" >> "$SQL_STATUS_FILE"
                    echo "自动标记: $file_name (版本 $file_version) 为已成功状态"
                fi
            fi
        fi
    done
}

# 带状态记录的SQL执行函数
execute_sql_with_status() {
    local sql_file="$1"
    local file_name=$(basename "$sql_file")
    local md5_checksum=$(calculate_md5 "$sql_file")
    
    # 检查是否已成功执行过相同文件
    if grep -q "^${file_name}|SUCCESS|.*|${md5_checksum}" "$SQL_STATUS_FILE"; then
        echo "检测到 ${file_name} 已成功执行且未修改，跳过执行"
        return 0
    fi
    
    # 记录开始执行
    echo "${file_name}|STARTED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$SQL_STATUS_FILE"
    
    # 执行SQL并捕获错误输出
    echo "========== 开始执行DEV SQL文件: $file_name =========="
    error_msg=$(mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$DEV_DB_NAME" < "$sql_file" 2>&1 >/dev/null)
    if [ $? -eq 0 ]; then
        # 执行成功
        echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$SQL_STATUS_FILE"
        echo "========== DEV SQL执行成功 =========="
        return 0
    else
        # 执行失败
        echo "${file_name}|FAILED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|${error_msg}" >> "$SQL_STATUS_FILE"
        echo "========== DEV SQL执行失败 =========="
        echo "错误信息: $error_msg"
        
        # 执行回滚操作
        echo "检测到DEV SQL执行失败，开始回滚..."
        restore_backup
        return 1
    fi
}

# 回滚函数
restore_backup() {
    echo "正在从备份恢复DEV系统..."

    # 先删除现有数据库
    echo "删除现有数据库..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $DEV_DB_NAME;"
    
    # 重新创建空数据库
    echo "重新创建空数据库..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "CREATE DATABASE $DEV_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
    
    # 恢复数据库
    echo "恢复DEV数据库..."
    zcat $bak_pathg/gougudev.sql.gz | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$DEV_DB_NAME"
    
    # 恢复文件系统
    echo "恢复DEV文件系统..."
    rm -rf /www/wwwroot/dev/*
    tar -xzf $bak_pathg/dev.tar.gz -C /www/wwwroot
    
    echo "DEV回滚完成，系统已恢复到升级前状态"
    echo " "
    echo "1、请处理上面提示问题后重新升级。"
    echo "2、之前已经正常升级过的（务必正常升级过的）请执行下面命令修复后，继续执行升级程序,其中gougu为容器名称，若为其他名称请自行修改， "
    echo "docker安装的执行：docker exec -it gougu sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/dev_upgrade_status.log"
    echo "纯系统安装的执行：sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/dev_upgrade_status.log"
    echo " "
    echo " "
    exit 1
}

echo "#####################################"
echo "开始升级DEV系统..."

# 获取当前版本
CURRENT_VERSION=$(get_current_version)
echo "当前DEV系统版本: $CURRENT_VERSION"

# 如果版本获取失败，设置默认版本
if [ -z "$CURRENT_VERSION" ] || [ "$CURRENT_VERSION" = "0.0.0" ]; then
    echo "警告：无法获取当前版本，假设为初始版本 3.13.15"
    CURRENT_VERSION="3.13.15"
fi

# 通过创建删除临时文件来更新dev目录的修改时间
echo "####" > /www/wwwroot/dev/read.txt
rm -rf /www/wwwroot/dev/read.txt

# 备份当前DEV系统
echo "备份当前DEV系统..."
rm -rf /data/dev $bak_pathu/dev.tar.gz $bak_pathg/dev.tar.gz
tar -czf $bak_pathg/dev.tar.gz -C /www/wwwroot dev

# 克隆新版本
echo "下载新版本DEV..."
cd /data
git clone https://gitee.com/gouguopen/dev.git || { echo "克隆失败，正在回滚..."; restore_backup; }

# 备份并恢复用户上传文件
echo "备份并恢复文件..."
mkdir -p /data/storage_backup

# 备份用户上传的文件（storage/app/public目录）
if [ -d "/www/wwwroot/dev/public/storage" ]; then
    cp -rf /www/wwwroot/dev/public/storage/* /data/storage_backup/ 2>/dev/null || true
    echo "已备份文件"
else
    echo "未找到目录，跳过备份"
fi

# 更新系统文件
echo "更新系统文件..."
cp -fru /data/dev/* /www/wwwroot/dev/

# 恢复用户上传的文件
echo "恢复文件..."
if [ -d "/data/storage_backup" ] && [ "$(ls -A /data/storage_backup 2>/dev/null)" ]; then
    cp -rf /data/storage_backup/* /www/wwwroot/dev/public/storage/ 2>/dev/null || true
    echo "文件恢复完成"
else
    echo "无文件需要恢复"
fi

# 清理备份
rm -rf /data/storage_backup

# 清理缓存
echo "清理系统缓存..."
cd /www/wwwroot/dev
php think clear

# 设置目录权限
echo "设置文件权限..."
chmod -R 777 /www/wwwroot/dev/{app,public,config,runtime}

# 更新数据库配置文件
echo "更新数据库连接配置..."
devsql=gougudev
devuser=gougudev
devpass=Abcdefg@123
devport=43306
sed -i "s/'database'\s*=>\s*'[^']*'/'database'           =>  '$devsql'/" /www/wwwroot/dev/config/database.php
sed -i "s/'username'\s*=>\s*'[^']*'/'username'           =>  '$devuser'/" /www/wwwroot/dev/config/database.php
sed -i "s/'password'\s*=>\s*'[^']*'/'password'           =>  '$devpass'/" /www/wwwroot/dev/config/database.php
sed -i "s/'hostport'\s*=>\s*'[^']*'/'hostport'           =>  '$devport'/" /www/wwwroot/dev/config/database.php

echo "#####################################"
# 处理升级文件（例如 SQL 脚本）
updatesql=/data/updatesql
rm -rf $updatesql
mkdir -p $updatesql

# 下载所有SQL升级文件
echo "正在下载升级文件..."
#wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/devsql/devupdate000.5.18.sql
#wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/devsql/devupdate001_5.1.8.sql
#wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/devsql/devupdate002_5.5.0.sql

# 为所有SQL文件添加MySQL dump头
SQL_HEADER="-- MySQL dump 10.13  Distrib 8.0.36, for Linux (x86_64)
--
-- Host: 127.0.0.1    Database: gougudev
-- ------------------------------------------------------
-- Server version    8.0.36

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

"

for sql_file in $updatesql/*.sql; do
    if [ -f "$sql_file" ]; then
        temp_file="${sql_file}.tmp"
        echo "$SQL_HEADER" > "$temp_file"
        cat "$sql_file" >> "$temp_file"
        mv "$temp_file" "$sql_file"
        echo "数据库文件: $(basename "$sql_file")"
    fi
done

# 自动标记已升级版本为SUCCESS
mark_previous_versions_as_success "$CURRENT_VERSION" "$updatesql"

# 使用find命令获取updatesql目录下所有的.sql文件并按名称排序
UPGRADE_FILES=$(find "$updatesql" -maxdepth 1 -name "*.sql" | sort)

echo "开始执行DEV升级脚本..."
while IFS= read -r UPGRADE_FILE; do
    if [ -f "$UPGRADE_FILE" ]; then
        file_name=$(basename "$UPGRADE_FILE")
        file_version=$(extract_version_from_filename "$file_name")
        # 标准化版本进行比较
        std_file_version=$(echo "$file_version" | awk -F. '{ 
            for(i=1;i<=3;i++) { 
                if($i=="") $i=0 
            } 
            printf "%d.%d.%d", $1, $2, $3 
        }')
        std_current_version=$(echo "$CURRENT_VERSION" | awk -F. '{ 
            for(i=1;i<=3;i++) { 
                if($i=="") $i=0 
            } 
            printf "%d.%d.%d", $1, $2, $3 
        }')
        
        comparison=$(version_compare "$std_file_version" "$std_current_version")
        
        if [ "$comparison" = "greater" ]; then
            echo "需要执行升级: $file_name (版本 $file_version > 当前版本 $CURRENT_VERSION)"
            if ! execute_sql_with_status "$UPGRADE_FILE"; then
                exit 1
            fi
        else
            echo "跳过已升级: $file_name (版本 $file_version <= 当前版本 $CURRENT_VERSION)"
        fi
    else
        echo "警告：升级文件 $(basename "$UPGRADE_FILE") 不存在，跳过！"
    fi
done <<< "$UPGRADE_FILES"

# 删除下载的数据库文件
sleep 2
rm -rf $updatesql
echo "#####################################"

# 清理安装目录并创建更新备份
rm -rf /www/wwwroot/dev/app/install
tar -czf $bak_pathu/dev.tar.gz -C /www/wwwroot dev
rm -rf /data/dev

echo "DEV升级完成"
# end4
#




# start5
MYSQL_USER="root"
MYSQL_PASSWORD="Abcdefg@123"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="43306"
OA_DB_NAME="gouguoa"
BLOG_DB_NAME="gougublog"
DEV_DB_NAME="gougudev"

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho


echo "#####################################"
# 检测MySQL连接
if ! mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P $MYSQL_PORT -e "SELECT 1" > /dev/null 2>&1; then
    echo "错误：无法连接到MySQL服务器，请检查服务状态或配置！" >&2
    exit 1
fi
cd /data
#这里的mysqldump路径修改成实际的路径、-u用户名 -p密码，都要修改
mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P $MYSQL_PORT $OA_DB_NAME | gzip > $bak_pathu/gouguoa.sql.gz
mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P $MYSQL_PORT $BLOG_DB_NAME | gzip > $bak_pathu/gougublog.sql.gz
mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P $MYSQL_PORT $DEV_DB_NAME | gzip > $bak_pathu/gougudev.sql.gz
#
echo "#####################################"

echo "#####################################"
echo "mysql备份完成"
#
echo "#####################################"
echo "等待马上完成...."

# 定义updatefiles备份目录
backup_dir="$bak_pathu/updateallfiles_$(date +\%Y\%m\%d\%H\%M)"

# 创建备份目录
mkdir -p "$backup_dir" || { echo "无法创建备份目录: $backup_dir"; exit 1; }

cp -f $bak_pathu/{office.tar.gz,blog.tar.gz,dev.tar.gz,gouguoa.sql.gz,gougublog.sql.gz,gougudev.sql.gz}  /$backup_dir

echo "备份updatefiles完成"
#
# 定义备份目录upgradefiles
backup_dirg="$bak_pathg/upgradefiles_$(date +\%Y\%m\%d\%H\%M)"

# 创建备份目录
mkdir -p "$backup_dirg" || { echo "无法创建备份目录: $backup_dirg"; exit 1; }

# 复制目录
cp -f $bak_pathg/{office.tar.gz,blog.tar.gz,dev.tar.gz,gouguoa.sql.gz,gougublog.sql.gz,gougudev.sql.gz}  /$backup_dirg
echo "备份目录upgradefiles完成"
#
rm -rf /data/backup/backupmysql
echo "#####################################"
echo "升级完成"
# end5
#
#





# start6
# 还原升级后数据
MYSQL_USER="root"
MYSQL_PASSWORD="Abcdefg@123"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="43306"
OA_DB_NAME="gouguoa"
BLOG_DB_NAME="gougublog"
DEV_DB_NAME="gougudev"

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho




# 设置脚本在遇到错误时自动退出
set -e

# 定义变量
#bak_pathu="/data/backup/upgradefiles"  # 备份文件存放路径
TARGET_DIR="/www/wwwroot"              # 解压目标目录
DB_USER="root"                         # MySQL 用户名
DB_PASS="Abcdefg@123"                  # MySQL 密码
DB_HOST="127.0.0.1"                    # MySQL 主机地址

# 创建目标目录（如果不存在）
if [ ! -d "$TARGET_DIR" ]; then
    echo "创建目标目录 $TARGET_DIR..."
    mkdir -p "$TARGET_DIR"
    chmod 755 "$TARGET_DIR"  # 设置合理的权限
    echo "目录创建成功！"
fi

# 定义需要检查的文件对
# 格式：tar_file:sql_file:db_name
FILE_PAIRS=(
    "office.tar.gz:gouguoa.sql.gz:gouguoa"
    "blog.tar.gz:gougublog.sql.gz:gougublog"
    "dev.tar.gz:gougudev.sql.gz:gougudev"
)

echo "开始检查并处理文件对..."

# 处理每个文件对
for pair in "${FILE_PAIRS[@]}"; do
    IFS=':' read -r -a files <<< "$pair"
    tar_file="${files[0]}"
    sql_file="${files[1]}"
    db_name="${files[2]}"
    dir_name="${tar_file%.tar.gz}"  # 从 tar_file 中提取目录名（如 office.tar.gz -> office）

    # 检查文件对是否存在
    if [ -f "$bak_pathu/$tar_file" ] && [ -f "$bak_pathu/$sql_file" ]; then
        echo "找到文件对: $tar_file 和 $sql_file，开始处理..."

        # 删除目标目录（如果存在）
        target_dir="$TARGET_DIR/$dir_name"
        if [ -d "$target_dir" ]; then
            echo "删除已存在的 $target_dir 目录..."
            rm -rf "$target_dir"
            echo "删除成功！"
        else
            echo "$target_dir 目录不存在，无需删除。"
        fi

        # 解压 tar.gz 文件到目标目录
        echo "正在解压 $tar_file 到 $TARGET_DIR..."
        tar -xzf "$bak_pathu/$tar_file" -C "$TARGET_DIR"
        echo "解压成功！"

        # 清空目标数据库并还原对应的 .sql.gz 文件
        echo "正在清空数据库 $db_name..."
        mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -P $MYSQL_PORT -e "DROP DATABASE IF EXISTS $db_name; CREATE DATABASE $db_name;"
        echo "数据库清空成功！"

        echo "正在还原 $sql_file 到 MySQL 数据库 $db_name..."
        gunzip < "$bak_pathu/$sql_file" | mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$db_name" -P $MYSQL_PORT
        echo "数据库还原成功！"
    else
        echo "未找到文件对: $tar_file 或 $sql_file，跳过处理。"
    fi
done

rm -rf /opt/updatemysqllog/{oa_upgrade_status.log,blog_upgrade_status.log,dev_upgrade_status.log}
chmod -R 777 /www/wwwroot/office/{app,public,config,runtime}
chmod -R 777 /www/wwwroot/blog/{app,public,config,runtime}
chmod -R 777 /www/wwwroot/dev/{app,public,config,runtime}

echo "还原升级后数据完成"
# end6
#












# start7
# 还原升级前数据
MYSQL_USER="root"
MYSQL_PASSWORD="Abcdefg@123"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="43306"
OA_DB_NAME="gouguoa"
BLOG_DB_NAME="gougublog"
DEV_DB_NAME="gougudev"

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho



# 设置脚本在遇到错误时自动退出
set -e

# 定义变量
#bak_pathg="/data/backup/upgradefiles"  # 备份文件存放路径
TARGET_DIR="/www/wwwroot"              # 解压目标目录
DB_USER="root"                         # MySQL 用户名
DB_PASS="Abcdefg@123"                  # MySQL 密码
DB_HOST="127.0.0.1"                    # MySQL 主机地址

# 创建目标目录（如果不存在）
if [ ! -d "$TARGET_DIR" ]; then
    echo "创建目标目录 $TARGET_DIR..."
    mkdir -p "$TARGET_DIR"
    chmod 755 "$TARGET_DIR"  # 设置合理的权限
    echo "目录创建成功！"
fi

# 定义需要检查的文件对
# 格式：tar_file:sql_file:db_name
FILE_PAIRS=(
    "office.tar.gz:gouguoa.sql.gz:gouguoa"
    "blog.tar.gz:gougublog.sql.gz:gougublog"
    "dev.tar.gz:gougudev.sql.gz:gougudev"
)

echo "开始检查并处理文件对..."

# 处理每个文件对
for pair in "${FILE_PAIRS[@]}"; do
    IFS=':' read -r -a files <<< "$pair"
    tar_file="${files[0]}"
    sql_file="${files[1]}"
    db_name="${files[2]}"
    dir_name="${tar_file%.tar.gz}"  # 从 tar_file 中提取目录名（如 office.tar.gz -> office）

    # 检查文件对是否存在
    if [ -f "$bak_pathg/$tar_file" ] && [ -f "$bak_pathg/$sql_file" ]; then
        echo "找到文件对: $tar_file 和 $sql_file，开始处理..."

        # 删除目标目录（如果存在）
        target_dir="$TARGET_DIR/$dir_name"
        if [ -d "$target_dir" ]; then
            echo "删除已存在的 $target_dir 目录..."
            rm -rf "$target_dir"
            echo "删除成功！"
        else
            echo "$target_dir 目录不存在，无需删除。"
        fi

        # 解压 tar.gz 文件到目标目录
        echo "正在解压 $tar_file 到 $TARGET_DIR..."
        tar -xzf "$bak_pathg/$tar_file" -C "$TARGET_DIR"
        echo "解压成功！"

        # 清空目标数据库并还原对应的 .sql.gz 文件
        echo "正在清空数据库 $db_name..."
        mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -P $MYSQL_PORT -e "DROP DATABASE IF EXISTS $db_name; CREATE DATABASE $db_name;"
        echo "数据库清空成功！"

        echo "正在还原 $sql_file 到 MySQL 数据库 $db_name..."
        gunzip < "$bak_pathg/$sql_file" | mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$db_name" -P $MYSQL_PORT
        echo "数据库还原成功！"
    else
     echo "未找到文件对: $tar_file 或 $sql_file，跳过处理。"
    fi
done

chmod -R 777 /www/wwwroot/office/{app,public,config,runtime}
chmod -R 777 /www/wwwroot/blog/{app,public,config,runtime}
chmod -R 777 /www/wwwroot/dev/{app,public,config,runtime}

rm -rf /opt/updatemysqllog/{oa_upgrade_status.log,blog_upgrade_status.log,dev_upgrade_status.log}
cp -f /opt/updatemysqllog/oa_upgrade_status.log.bak /opt/updatemysqllog/oa_upgrade_status.log
cp -f /opt/updatemysqllog/blog_upgrade_status.log.bak /opt/updatemysqllog/blog_upgrade_status.log
cp -f /opt/updatemysqllog/dev_upgrade_status.log.bak /opt/updatemysqllog/dev_upgrade_status.log

echo "还原升级前数据完成"
# end7
#








# start8
# 还原上次19:30备份数据
MYSQL_USER="root"
MYSQL_PASSWORD="Abcdefg@123"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="43306"
OA_DB_NAME="gouguoa"
BLOG_DB_NAME="gougublog"
DEV_DB_NAME="gougudev"

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho




# 设置脚本在遇到错误时自动退出
set -e

# 定义变量
#bak_pathg="/data/backup/upgradefiles"  # 备份文件存放路径
TARGET_DIR="/www/wwwroot"              # 解压目标目录
DB_USER="root"                         # MySQL 用户名
DB_PASS="Abcdefg@123"                  # MySQL 密码
DB_HOST="127.0.0.1"                    # MySQL 主机地址

# 创建目标目录（如果不存在）
if [ ! -d "$TARGET_DIR" ]; then
    echo "创建目标目录 $TARGET_DIR..."
    mkdir -p "$TARGET_DIR"
    chmod 755 "$TARGET_DIR"  # 设置合理的权限
    echo "目录创建成功！"
fi

# 定义需要检查的文件对
# 格式：tar_file:sql_file:db_name
FILE_PAIRS=(
    "office.tar.gz:gouguoa.sql.gz:gouguoa"
    "blog.tar.gz:gougublog.sql.gz:gougublog"
    "dev.tar.gz:gougudev.sql.gz:gougudev"
)

echo "开始检查并处理文件对..."

# 处理每个文件对
for pair in "${FILE_PAIRS[@]}"; do
    IFS=':' read -r -a files <<< "$pair"
    tar_file="${files[0]}"
    sql_file="${files[1]}"
    db_name="${files[2]}"
    dir_name="${tar_file%.tar.gz}"  # 从 tar_file 中提取目录名（如 office.tar.gz -> office）

    # 检查文件对是否存在
    if [ -f "$bak_pathb/$tar_file" ] && [ -f "$bak_pathb/$sql_file" ]; then
        echo "找到文件对: $tar_file 和 $sql_file，开始处理..."

        # 删除目标目录（如果存在）
        target_dir="$TARGET_DIR/$dir_name"
        if [ -d "$target_dir" ]; then
            echo "删除已存在的 $target_dir 目录..."
            rm -rf "$target_dir"
            echo "删除成功！"
        else
            echo "$target_dir 目录不存在，无需删除。"
        fi

        # 解压 tar.gz 文件到目标目录
        echo "正在解压 $tar_file 到 $TARGET_DIR..."
        tar -xzf "$bak_pathb/$tar_file" -C "$TARGET_DIR"
        echo "解压成功！"

        # 清空目标数据库并还原对应的 .sql.gz 文件
        echo "正在清空数据库 $db_name..."
        mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -P $MYSQL_PORT -e "DROP DATABASE IF EXISTS $db_name; CREATE DATABASE $db_name;"
        echo "数据库清空成功！"

        echo "正在还原 $sql_file 到 MySQL 数据库 $db_name..."
        gunzip < "$bak_pathb/$sql_file" | mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$db_name" -P $MYSQL_PORT
        echo "数据库还原成功！"
    else
        echo "未找到文件对: $tar_file 或 $sql_file，跳过处理。"
    fi
done

rm -rf /opt/updatemysqllog/{oa_upgrade_status.log,blog_upgrade_status.log,dev_upgrade_status.log}
chmod -R 777 /www/wwwroot/office/{app,public,config,runtime}
chmod -R 777 /www/wwwroot/blog/{app,public,config,runtime}
chmod -R 777 /www/wwwroot/dev/{app,public,config,runtime}

echo "还原上次19:30备份数据完成"
# end8













# start9
# 还原其它机器备份数据
MYSQL_USER="root"
MYSQL_PASSWORD="Abcdefg@123"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="43306"
OA_DB_NAME="gouguoa"
BLOG_DB_NAME="gougublog"
DEV_DB_NAME="gougudev"

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho

# 设置脚本在遇到错误时自动退出
set -e

# 定义变量
#bak_patho="/data/backup/upgradefiles"  # 备份文件存放路径
TARGET_DIR="/www/wwwroot"              # 解压目标目录
DB_USER="root"                         # MySQL 用户名
DB_PASS="Abcdefg@123"                  # MySQL 密码
DB_HOST="127.0.0.1"                    # MySQL 主机地址

# 创建目标目录（如果不存在）
if [ ! -d "$TARGET_DIR" ]; then
    echo "创建目标目录 $TARGET_DIR..."
    mkdir -p "$TARGET_DIR"
    chmod 755 "$TARGET_DIR"  # 设置合理的权限
    echo "目录创建成功！"
fi

echo "##########################################################"
echo "##########################################################"
echo -e "\e[34m执行外部数据请把数据上传到/映射目录/backup/other/目录下
文件格式office为文件包office.tar.gz，数据库gouguoa.sql.gz
文件格式blog为文件包blog.tar.gz，数据库gougublog.sql.gz
文件格式office为文件包dev.tar.gz，数据库gougudev.sql.gz
以上文件包及文件可以参考/data/backup/backupallfiles/目录的内容\e[0m"
echo "##########################################################"
echo "##########################################################"
# 定义需要检查的文件对
# 格式：tar_file:sql_file:db_name
FILE_PAIRS=(
    "office.tar.gz:gouguoa.sql.gz:gouguoa"
    "blog.tar.gz:gougublog.sql.gz:gougublog"
    "dev.tar.gz:gougudev.sql.gz:gougudev"
)

echo "开始检查并处理文件对..."

# 处理每个文件对
for pair in "${FILE_PAIRS[@]}"; do
    IFS=':' read -r -a files <<< "$pair"
    tar_file="${files[0]}"
    sql_file="${files[1]}"
    db_name="${files[2]}"
    dir_name="${tar_file%.tar.gz}"  # 从 tar_file 中提取目录名（如 office.tar.gz -> office）

    # 检查文件对是否存在
    if [ -f "$bak_patho/$tar_file" ] && [ -f "$bak_patho/$sql_file" ]; then
        echo "找到文件对: $tar_file 和 $sql_file，开始处理..."

        # 删除目标目录（如果存在）
        target_dir="$TARGET_DIR/$dir_name"
        if [ -d "$target_dir" ]; then
            echo "删除已存在的 $target_dir 目录..."
            rm -rf "$target_dir"
            echo "删除成功！"
        else
            echo "$target_dir 目录不存在，无需删除。"
        fi

        # 解压 tar.gz 文件到目标目录
        echo "正在解压 $tar_file 到 $TARGET_DIR..."
        tar -xzf "$bak_patho/$tar_file" -C "$TARGET_DIR"
        echo "解压成功！"

        # 清空目标数据库并还原对应的 .sql.gz 文件
        echo "正在清空数据库 $db_name..."
        mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -P $MYSQL_PORT -e "DROP DATABASE IF EXISTS $db_name; CREATE DATABASE $db_name;"
        echo "数据库清空成功！"

        echo "正在还原 $sql_file 到 MySQL 数据库 $db_name..."
        gunzip < "$bak_patho/$sql_file" | mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$db_name" -P $MYSQL_PORT
        echo "数据库还原成功！"
    else
        echo "未找到文件对: $tar_file 或 $sql_file，跳过处理。"
    fi
done


oasql=gouguoa
oauser=gouguoa
oapass=Abcdefg@123
oaport=43306
sed -i "s/'database'\s*=>\s*'[^']*'/'database'           =>  '$oasql'/" /www/wwwroot/office/config/database.php
sed -i "s/'username'\s*=>\s*'[^']*'/'username'           =>  '$oauser'/" /www/wwwroot/office/config/database.php
sed -i "s/'password'\s*=>\s*'[^']*'/'password'           =>  '$oapass'/" /www/wwwroot/office/config/database.php
sed -i "s/'hostport'\s*=>\s*'[^']*'/'hostport'           =>  '$oaport'/" /www/wwwroot/office/config/database.php
#
blogsql=gougublog
bloguser=gougublog
blogpass=Abcdefg@123
blogport=43306
sed -i "s/'database'\s*=>\s*'[^']*'/'database'           =>  '$blogsql'/" /www/wwwroot/blog/config/database.php
sed -i "s/'username'\s*=>\s*'[^']*'/'username'           =>  '$bloguser'/" /www/wwwroot/blog/config/database.php
sed -i "s/'password'\s*=>\s*'[^']*'/'password'           =>  '$blogpass'/" /www/wwwroot/blog/config/database.php
sed -i "s/'hostport'\s*=>\s*'[^']*'/'hostport'           =>  '$blogport'/" /www/wwwroot/blog/config/database.php

devsql=gougudev
devuser=gougudev
devpass=Abcdefg@123
devport=43306
sed -i "s/'database'\s*=>\s*'[^']*'/'database'           =>  '$devsql'/" /www/wwwroot/dev/config/database.php
sed -i "s/'username'\s*=>\s*'[^']*'/'username'           =>  '$devuser'/" /www/wwwroot/dev/config/database.php
sed -i "s/'password'\s*=>\s*'[^']*'/'password'           =>  '$devpass'/" /www/wwwroot/dev/config/database.php
sed -i "s/'hostport'\s*=>\s*'[^']*'/'hostport'           =>  '$devport'/" /www/wwwroot/dev/config/database.php

rm -rf /opt/updatemysqllog/{oa_upgrade_status.log,blog_upgrade_status.log,dev_upgrade_status.log}
chmod -R 777 /www/wwwroot/office/{app,public,config,runtime}
chmod -R 777 /www/wwwroot/blog/{app,public,config,runtime}
chmod -R 777 /www/wwwroot/dev/{app,public,config,runtime}

echo "还原其它机器备份数据完成"
# end9